#ifndef __CONEXION_H__
#define __CONEXION_H__

#include "cola_mensaje.h"
#include "paquete.h"
#include "stdlib.h"

/*
 * Codigo
 */
#define CON_CONECTANDO 0
#define CON_DESCONECTANDO 1
#define CON_CONECTADO 2
#define CON_DESCONECTADO 3
#define CON_ERROR 4

#define CON_DATOS_ENVIADOS 5
#define CON_DATOS_RECIBIDOS 6

#define CON_NUEVA_CONEXION 7
#define CON_ABIERTO 8
#define CON_CERRADO 9


struct conexion;

typedef void(*conexion_callback)(struct conexion *con, int codigo, void *data, int size);

struct conexion{
  paquete *paquete_saliente;
  paquete *paquete_entrante;
  cola_mensaje *mensajes_salientes;
  cola_mensaje *mensajes_entrantes;
  int socket;
  int status;
  conexion_callback callback;

  char eliminar;
};

typedef struct conexion conexion;

//COMUN
int conexion_crear(conexion **c, conexion_callback callback);
int conexion_destruir(conexion **c);
int conexion_enviar(conexion *c, void *datos, int size);
char* conexion_describir_status(int codigo);
int conexion_procesar(conexion *c);

//SOCKET_CLIENTE
int conexion_conectar(conexion *c, char *servidor);
//SOCKET_COMUN
int conexion_desconectar(conexion *c);
//SOCKET_SERVIDOR
int conexion_escuchar(conexion *c, int puerto);
int conexion_aceptar(conexion *accept, conexion **nuevo_cliente, conexion_callback callback);
//INTERNAS
int conexion_procesar_envios(conexion *c);
int conexion_procesar_recepciones(conexion *c);
int conexion_procesar_conexion(conexion *c);
int conexion_publish(conexion *c, int status, void *data, int size);
int conexion_set_status(conexion *c, int status);
int conexion_write(conexion *origen, void *datos, int size);
int conexion_read(conexion *read, void *datos, int size);


#endif
